#ifndef _PATH_HPP_
#define _PATH_HPP_

#include <boost/shared_ptr.hpp>
#include <vector>
#include "Matrix.hpp"

typedef std::vector<std::vector<int> > MatrixType;
typedef MatrixType::const_iterator ConstItr2D;
typedef boost::shared_ptr<MatrixType> PMatrixType;
typedef std::vector<int> ArrayType;
typedef ArrayType::const_iterator ConstItr1D;
typedef boost::shared_ptr<Matrix> PMatrix;

//!Klasa reprezentujaca sciezke dopasowania
class Path {
public:
	//!Konstruktor
	Path();

	//!Destruktor
	~Path();

	//!Funkcja tworzaca sciezke dopasowania sekwencji
	/*!
     * \param matrix macierz podstawien
	 */
	void findPath(const PMatrix matrix, const int end_value);
	
	//!Funkcja pobierajaca sciezke dopasowania sekwencji
	/*!
     * \return sciezka dopasowania
	 */
	const PMatrixType getPath() const { return path_; }

	//!Funkcja rekonstrujaca sekwencje wynikowe
	/*!
     * \param seq1 pierwsza sekwencja
	 * \param seq2 druga sekwencja
	 */
	void reconstructAlignment(const PSequence seq1, const PSequence seq2);
	
	//!Funkcja pobierajaca wynik rekonstrukcji
	/*!
     * \return pierwsza zrekonstruowana sekwencja
	 */
	const PSequence getFirstAlignment() const { return firstAlignment_; }

	//!Funkcja pobierajaca wynik rekonstrukcji
	/*!
     * \return druga zrekonstruowana sekwencja
	 */
	const PSequence getSecondAlignment() const { return secondAlignment_; }

private:
	//!Prywatna funkcja znajdujaca maksymalna wartosc macierzy podstawien
	/*!
	 * \param matrix macierz podstawien
	 */
	void findMaxValue(const PMatrixType matrix);
	
	//!Sciezka dopasowania
	PMatrixType path_;

	//!Pierwsza zrekonstruowana sekwencja 
	PSequence firstAlignment_;

	//!Druga zrekonstruowana sekwencja 
	PSequence secondAlignment_;
};

#endif // _PATH_HPP_
